package casess;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: fzykd
 * Date: 2022-10-24
 * Time: 14:17
 */

class Singleton1 {
    //volatile 防止指令重排序
    private static volatile Singleton1 instance = null;

    private Singleton1(){}

    //饿汉模式存在线程安全问题
    //第一:当多个线程同时读取getInstance的时候 修改instance的操作 不是原子性的 那莪解决办法就是加锁
    public static Singleton1 getInstance() {
        //第三: Singleton的创建分为三部  为对象分配内存 初始化 将地址赋值给引用 当读个线程读取是
        // 为了防止指令重排序的问题 在对象上加上volatile
        if (instance == null) {
            synchronized (Singleton1.class) {
                //第二:加锁之后 一旦这个instance被初始化之后 instance一定不为空 那么这个判断语句一定不成立
                //那么大量的线程去调用这个 instance 就会产生锁竞争 所以在锁的外面在加一层if判断
                if (instance == null) {
                    instance = new Singleton1();
                }
            }
        }
        return instance;
    }
}

//单例模式 - 懒汉模式
public class Demo2 {

    Singleton1 instance = Singleton1.getInstance();
}
